iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
佛心分享-IT 人自學之術

靠近 ASP .NET Core 一點點系列 第 8

Day 8 Middleware : 對於專案可以很靈活又擴充的中介軟體

  • 分享至 

  • xImage
  •  

前言
前面六天的重點都是對於 ASP .NET Core 一些最基本的設定、管理與應用的知識,今天要進入對 ASP .NET Core內重點之一的內容,慢慢會發現,其實從第二天內容到今天,都是息息相關的。這也是我覺得先了解這些底層原理設定,對於學習 ASP .NET Core 才是比較妥當的,這主題會先從生命週期運作分享,然後再加入 Middleware 。

分享主軸

  • 介紹整個 ASP .NET Core 執行生命週期
  • 說明 Middleware (上)

ASP.NET Core 生命週期

  • ASP.NET Core 的執行生命週期從接收到 HTTP 請求開始,經過一系列的中介軟體(Middleware)處理,最終生成回應並返回給用戶端

簡易畫一張圖供參考 :

HTTP Request
     |
     v
Web Server (IIS, Nginx, etc. 反向代理伺服器)
     |
     v
Kestrel (ASP.NET Core 內建伺服器)
     |
     v
Middleware Pipeline
     |
     v
Routing
     |
     v
Controller
     |
     v
Action Method
     |
     v
Generate Response
     |
     v
Middleware Pipeline (返回)
     |
     v
Kestrel
     |
     v
Web Server
     |
     v
HTTP Response

上圖簡易說明 :

  1. HTTP Request:用戶端(Client)發送 HTTP 請求。
  2. Web Server:請求首先進入 Web Server(如 IIS 或 Nginx)。
  3. Kestrel:Web Server 將請求轉發給 ASP.NET Core 的內建伺服器 Kestrel。
  4. Middleware Pipeline:請求進入 Middleware 管線,每個 Middleware 都可以對請求進行處理或修改,然後將請求傳遞給下一個 Middleware。
  5. Routing:路由中介軟體解析請求的路徑,並將其對應到相應的控制器。
  6. Controller:控制器接收請求並調用相應的 Action 方法。
  7. Action Method:Action 方法執行具體的業務邏輯,並生成回應。
  8. Generate Response:生成的回應經過 Middleware 管線返回。
  9. Middleware Pipeline (返回):回應經過 Middleware 管線的返回路徑,可能會被進一步處理。
  10. Kestrel:回應返回給 Kestrel。
  11. Web Server:Kestrel 將回應轉發給 Web Server。
  12. HTTP Response:Web Server 將回應返回給用戶端

ASP.NET Core 中的 Middleware

  • 專門處理 ASP.NET Core 底層工作:Middleware 負責處理所有 HTTP 的請求(Request)與回應(Response)。

  • Middleware 的限制:Middleware 是底層的,因此無法直接接觸到 MVC 那層(應用層)的東西

Middleware 的執行順序

如下程式碼所示範

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

    // Middleware 1
    app.Use(async (context, next) =>
    {
        Console.WriteLine("1");
        await next();
        Console.WriteLine("2");
    });

    // Middleware 2
    app.Use(async (context, next) =>
    {
        Console.WriteLine("3");
        await next();
        Console.WriteLine("4");
    });

    // Middleware 3
    app.Use(async (context, next) =>
    {
        Console.WriteLine("5");
        await next();
        Console.WriteLine("6");
    });

    // 終端 Middleware
    app.Run(async context =>
    {
        Console.WriteLine("終端Middleware");
        await context.Response.WriteAsync("Hello, World!");
    });
app.Run();

由上方結果得出順序會是 1 -> 3 -> 5 -> 終端Middleware -> 6 -> 4 -> 2
https://ithelp.ithome.com.tw/upload/images/20240921/20133954NwMQ6uiVlX.png

  • 每一個 Middleware 遇到 next() 時,會暫停並跳到下一個 Middleware 執行,然後再回到上一個 Middleware 繼續執行。

  • Middleware內的 app.Use 是指定義 Middleware 元件,app.Map 是用來定義特定路徑的 Middleware 或自訂義路由,app.Run 是用來實作請求管道中的終端 Middleware。

  • 所有 Middleware 包括 app.Use 和 app.Map 定義的 Middleware 都有順序性,只是 app.Map 定義的 Middleware 只會在特定路徑執行。

簡單統整一下今日重點

  • Middleware 有順序性
  • Middleware 是中介層,主要處理 HTTP 請求和回應,並在請求到達 MVC 控制器之前或回應離開 MVC 控制器之後進行處理
  • Middleware 遇到 next(),會跳下一個 Middleware

今日結語
今天對於 ASP .NET Core 的 Middleware 做一個了解學習,包括代表生命週期與代表意思、執行順序等等。
明天會針對如何自己寫一個簡單 Middleware 去做示範分享。

今天分享到這邊,希望對大家有所幫助,謝謝,明天繼續加油努力!


上一篇
Day 7 Kestrel : 到底是什麼 ? 與 ASP .NET Core 關係 ?
下一篇
Day 9 Middleware : 自己動手做 Middleware 範例
系列文
靠近 ASP .NET Core 一點點27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言